package com.feng.thread;

import java.util.HashMap;
import java.util.Map;

/**
 * ThreadLocal类用来提供线程内部的局部变量。这种变量在多线程环境下访问(通过get或set方法访问)
 * 时能保证各个线程里的变量相对独立于其他线程内的变量。ThreadLocal实例通常来说都是private static类型的，用于关联线程和线程的上下文
 * 提供线程内部的局部变量，在本线程内随时随地可取，隔离其他线程。
 * 
 * @author Qian
 *
 */
public class ThreadLocalDemo {

	@SuppressWarnings("rawtypes")
	static ThreadLocal<HashMap> map0 = new ThreadLocal<HashMap>() {
		@Override
		protected HashMap initialValue() {// 初始化ThreadLocal，并赋值
			System.out.println(Thread.currentThread().getName() + "initialValue");
			return new HashMap();
		}
	};

	public void run() { // 只是自定义的一个方法,用来创建多个线程对象，并循环启动每个线程。
		Thread[] runs = new Thread[4];
		for (int i = 0; i < runs.length; i++) {
			runs[i] = new Thread(new T1(i)); // 创建线程对象，四个
		}
		for (int i = 0; i < runs.length; i++) {
			runs[i].start(); // 启动线程，4个线程
		}
	}

	public static class T1 implements Runnable {
		int id;

		public T1(int id0) {
			id = id0;
		}

		@SuppressWarnings({ "rawtypes", "unchecked" })
		public void run() {
			System.out.println(Thread.currentThread().getName() + ":start");
			// HashMap map = map0.get(); // 用来获取与当前线程关联的ThreadLocal的值
			Map map = new HashMap();
			for (int i = 0; i < 10; i++) {
				map.put(i, i + id * 100);
				try {
					Thread.sleep(200); // 睡眠0.2s
				} catch (Exception ex) {
				}
			}
			System.out.println(Thread.currentThread().getName() + ':' + map);
		}
	}

	/**
	 * Main
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		ThreadLocalDemo test = new ThreadLocalDemo();
		test.run(); // 调用创建和启动线程的方法
	}

}
